package com.exchange.controller.app.chain;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.*;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.exchange.controller.BaseController;
import com.exchange.controller.app.article.ArticleValidator;
import com.exchange.interceptor.AppUserTokenInterceptor;
import com.exchange.util.ResponseData;
import com.jfinal.aop.Before;
import com.jfinal.aop.Inject;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 充提币控制器,与钱包服务器相连
 **/
@Before({ChainValidator.class,AppUserTokenInterceptor.class})
public class ChainController extends BaseController {

	@Inject
	ChainService service;

//    /**
//     * 获取代币对应的钱包地址,要调用main服务器获取
//     * @return
//     */
//	//TODO
//    public void address(){
//    	
//    	
//    	// TODO 查询用户充币地址(String userAccount, String sonServerName)http传入钱包服务
//		Map<String, Object> paramMap = MapUtil.newHashMap();
//		paramMap.put("userAccount", account);
//		paramMap.put("sonServerName", "sonServerName");
//		String re = HttpUtil.post("钱包服务地址userAddress", paramMap);
//		JSONObject jsonObject = JSONUtil.parseObj(re);
//		boolean state = jsonObject.getBool("Success");
//		
//		//将地址更新入数据库
//		
//		//返回前端
//    	
//    	
//        ResponseData data = ResponseData.ok();
//        try {
//            //登录用户
//            UserDTO user = getLoginUser( request);
//            //用户id
//            dto.setUserId( user.getId());
//            //状态
//            dto.setState( BizConst.BIZ_STATUS_VALID);
//            //获取钱包地址
//            data.setData( shenkuDepositWithdrawTaskService.findWalletAddress( dto));
//        }catch (Exception ex){
//            ExUtils.error( ex, LocaleKey.SYS_QUERY_FAILED);
//        }
//        return  data;
//    }
//
//    /**
//     * 充币流水
//     * @param dto
//     * @param request
//     * @return
//     */
//    public ResponseData deposit(@RequestBody PageDTO dto, HttpServletRequest request){
//        ResponseData data = ResponseData.ok();
//        try {
//            //登录用户
//            UserDTO user = getLoginUser( request);
//            //用户id
//            dto.setUserId( user.getId());
//            dto.setTxType(IntUtils.INT_ONE);
//            //开始分页
//            Page<ShenKuDepositWithdrawTaskVO> page = PageHelper.startPage( dto.getPageNum(), dto.getPageSize());
//            //列表
//            List<ShenKuDepositWithdrawTaskVO> list = shenkuDepositWithdrawTaskService.depositWithdraw(dto);
//            //返回数据
//            data.setData( PageVO.builder()
//                            .total( page.getTotal())
//                            .list( list).build());
//        }catch (Exception ex){
//            ExUtils.error( ex, LocaleKey.SYS_QUERY_FAILED);
//        }
//        return data;
//    }
//
//    /**
//     * 提币流水
//     * @param dto  id=null, market=null, pageSize=10, pageNum=1, start=null, end=null, type=null, chooseType=null, userId=null, advertId=null, orderId=null, symbol=null, coinPair=null, state=null, paging=null, scope=null, tabIndex=null, opinion=null, title=null, payType=null, rate=null, limit=null, txType=2, txStatus=1
//     * @param request
//     * @return
//     */
//    public ResponseData withdraw(@RequestBody PageDTO dto, HttpServletRequest request){
//        ResponseData data = ResponseData.ok();
//        try {
//            //登录用户
//            UserDTO user = getLoginUser( request);
//            //用户id
//            dto.setUserId( user.getId());
//            dto.setTxType(IntUtils.INT_TWO);
//            //开始分页
//            Page<ShenKuDepositWithdrawTaskVO> page = PageHelper.startPage( dto.getPageNum(), dto.getPageSize());
//            //列表
//            List<ShenKuDepositWithdrawTaskVO> list = shenkuDepositWithdrawTaskService.depositWithdraw(dto);
//            //返回数据
//            data.setData( PageVO.builder()
//                    .total( page.getTotal())
//                    .list( list).build());
//        }catch (Exception ex){
//            ExUtils.error( ex, LocaleKey.SYS_QUERY_FAILED);
//        }
//        return data;
//    }
//
//    /**
//     * 提币短信
//     * @param dto
//     * @param valid
//     * @param request
//     * @return
//     */
//    public ResponseData captcha(@RequestBody @Valid CipherCaptchaDTO dto, BindingResult valid, HttpServletRequest request) {
//        ResponseData data = ResponseData.ok();
//        try {
//            if (valid.hasErrors()) {
//                throw ExUtils.error( valid);
//            }
//            // 登录用户
//            UserDTO user = getLoginUser( request);
//            //用户详情
//            UserEntity entity = userService.findUserByCondition( UserDTO.builder()
//                                            .id( user.getId())
//                                            .state( BizConst.BIZ_STATUS_VALID).build());
//            if( StrUtil.isEmpty( entity.getEmail()) || StrUtil.isEmpty( entity.getMobile())){
//                throw ExUtils.error( LocaleKey.USER_MOBILE_OR_EMAIL_IS_NUll);
//            }
//            // 是否实名认证
//            if ( !IntUtils.equals( entity.getVerified(), BizConst.KycConst.K2_OK)) {
//                throw ExUtils.error( LocaleKey.USER_C2_NOT_ACCESS);
//            }
//            // 验证资金密码
//            String ins = SecureUtil.md5( StrUtil.addSuffixIfNot( dto.getPassword(), BizConst.BIZ_SECRET_CODE));
//            if ( !StrUtil.equals( ins, entity.getCipher())) {
//                throw ExUtils.error( LocaleKey.USER_CIPHER_PASSWORD_ERROR);
//            }
//            // 获取之前验证码
//            String captcha = StrUtil.EMPTY;
//            if( StrUtil.equals( dto.getType(), BizConst.MOBILE)){
//                captcha = getCaptchaCode(RedisConst.PLATFORM_REDIS_WITHDRAWAL, entity.getMobile());
//            }else{
//                captcha = getCaptchaCode(RedisConst.PLATFORM_REDIS_WITHDRAWAL, entity.getEmail());
//            }
//            if( StrUtil.isNotEmpty( captcha)){
//                throw ExUtils.error( LocaleKey.USER_CAPTCHA_HAS_SEND);
//            }
//            //验证码
//            String code = RandomUtil.randomNumbers( AppConst.DEFAULT_CODE_LENGTH);
//            //设置缓存
//            if( StrUtil.equals( dto.getType(), BizConst.MOBILE)){
//                redisPlugin.set(StrUtil.addSuffixIfNot( RedisConst.PLATFORM_REDIS_WITHDRAWAL, entity.getMobile()),
//                                                                code, AppConst.VERIFICATION_CODE_TIME);
//                // 发送短信验证码
//                smsUtils.sendMessage(BizConst.SMS_TYPE_WITHDRAW, entity.getMobile(), new String[]{code});
//            }else{
//                redisPlugin.set(StrUtil.addSuffixIfNot( RedisConst.PLATFORM_REDIS_WITHDRAWAL, entity.getEmail()),
//                                                                code, AppConst.VERIFICATION_CODE_TIME);
//                //发送邮件
//                emailUtils.sendMessage(BizConst.SMS_TYPE_WITHDRAW, user.getEmail(), EmailConst.EMAIL_CAPTCHA_WITHDRAW, new String[]{code});
//            }
//        } catch (Exception ex) {
//            ExUtils.error( ex, LocaleKey.SYS_PARAM_ERROR);
//        }
//        return data;
//    }
//
//    /**
//     * 提币申请
//     * 0.提交神库提现任务(0后台操作,不在这写逻辑)
//     * 
//     * 1.添加提现流水（含有提现状态）
//     * 3.修改钱包余额
//     * 提现任务 id 的生成规则（建议使用，保证唯一性）： 币种+时间（14 位，到秒）+编号（6 位） HT_ERC20-20190618225912-123456
//     * @return
//     */
//    public ResponseData withdraw(@RequestBody @Valid WithdrawDTO dto, BindingResult valid, HttpServletRequest request){
//        ResponseData data = ResponseData.ok();
//        try {
//            if ( valid.hasErrors()) {
//                throw ExUtils.error( valid);
//            }
//            // 登录用户
//            UserDTO user = getLoginUser( request);
//            //用户详情
//            UserEntity userEntity = userService.findUserByCondition( UserDTO.builder()
//                                                .id( user.getId())
//                                                .state( BizConst.BIZ_STATUS_VALID).build());
//            // 是否实名认证
//            if ( !IntUtils.equals( userEntity.getVerified(), BizConst.KycConst.K2_OK)) {
//                throw ExUtils.error( LocaleKey.USER_C2_NOT_ACCESS);
//            }
//            // 短信验证码
//            ///String sms = getCaptchaCode(RedisConst.PLATFORM_REDIS_WITHDRAWAL, userEntity.getMobile());
//            //邮箱验证
//            //String email = getCaptchaCode( RedisConst.PLATFORM_REDIS_WITHDRAWAL, userEntity.getEmail());
//            //判断
//            /*if ( !StrUtil.equals( sms, dto.getSms()) || !StrUtil.equals( email, dto.getEml())) {
//                throw ExUtils.error(LocaleKey.USER_INVALID_VERIFICATION_CODE);
//            }*/
//            //资金密码
//            String ins = SecureUtil.md5( StrUtil.addSuffixIfNot( dto.getPassword(), BizConst.BIZ_SECRET_CODE));
//            // 验证资金密码
//            if ( !StrUtil.equals(ins, userEntity.getCipher())) {
//                // 资金密码错误
//                throw ExUtils.error( LocaleKey.USER_CIPHER_PASSWORD_ERROR);
//            }
//            // 当前货币
//            CoinEntity coinEntity = getToken( dto.getSymbol());
//            if ( ObjectUtil.isEmpty( coinEntity)) {
//                throw ExUtils.error( LocaleKey.SYS_PARAM_ERROR);
//            }
//            //判断当前代币是否允许转出
//            if( StrUtil.equals( coinEntity.getAllowOut(), AppConst.FIELD_N)){
//                throw ExUtils.error( LocaleKey.COIN_IS_NOT_ALLOW_WITHDRAW);
//            }
//            //判断当前货币提币是否低于最低提币值
//            if(NumberUtil.isGreater( coinEntity.getLowerLimitOut(), dto.getNumber())){
//                throw ExUtils.error( LocaleKey.USER_WITHDRAW_NUMBER_LESS_LIMIT);
//            }
//            // 当前用户钱包信息
//            UserWalletEntity walletEntity = walletService.findByCondition( BaseDTO.builder().symbol( dto.getSymbol()).userId( user.getId()).build());
//            if ( ObjectUtil.isEmpty( walletEntity)) {
//                throw ExUtils.error( LocaleKey.WALLET_INSUFFICIENT_FUNDS); // 余额不不足
//            }
//            // 验证转出
//            if ( StrUtil.isEmpty(coinEntity.getFeeSymbol()) || StrUtil.equals( coinEntity.getSymbol(), coinEntity.getFeeSymbol())) {
//                //转出货币与手续费货币一致
//            	//计算手续费
//            	BigDecimal fee = new BigDecimal("0");
//            	if ( walletEntity.getBalance().compareTo( dto.getNumber().add(fee)) < 0) {
//            		throw ExUtils.error( LocaleKey.WALLET_INSUFFICIENT_FUNDS); // 余额不不足
//            	}
//            } else {
//                //手续费货币钱包
//                UserWalletEntity feeEntity = walletService.queryUserWallet( UserWalletDTO.builder().symbol( coinEntity.getFeeSymbol()).userId( user.getId()).build());
//                //计算手续费
//                BigDecimal fee = new BigDecimal("0");
//                //手续费货币钱包
//                if ( ObjectUtil.isEmpty(feeEntity) || feeEntity.getBalance().compareTo(fee) < 0) {
//                	throw ExUtils.error( LocaleKey.WALLET_INSUFFICIENT_FUNDS); // 手续费余额不不足
//                }
//                //钱包余额不足
//                if (feeEntity.getBalance().compareTo(dto.getNumber()) < 0) {
//                	throw ExUtils.error( LocaleKey.WALLET_INSUFFICIENT_FUNDS); // 余额不不足
//                }
//            }
//            
//            
//            //存流水，改钱包
//            ShenkuDepositWithdrawTaskEntity depositTask = new ShenkuDepositWithdrawTaskEntity();
//            
//            String WithdrawId = coinEntity.getSymbol() + DateUtil.currentSeconds() + UUID.randomUUID();
//            depositTask.setWithdrawId(WithdrawId);
//            depositTask.setCoin(coinEntity.getSymbol());
//            depositTask.setToAddress(dto.getAddress());
//            depositTask.setMemo("");
//            depositTask.setTxAmount(dto.getNumber());
//            depositTask.setFeeAmount(null);
//            depositTask.setGasPrice("");
//            depositTask.setGasLimit("");
//            
//            depositTask.setUserId(user.getId());
//            depositTask.setType(IntUtils.INT_TWO);//提币
//            depositTask.setTxStatus("myPending");//提交状态
//            depositTask.setMyFeeCoin(coinEntity.getFeeSymbol());
//            depositTask.setMyFeeAmount(new BigDecimal(1));//coinEntity.getOutFee()
//            depositTask.setCreateTime(new Date().getTime());
//            
//	        userWalletService.AddFlowChain(depositTask); 
//
//        }catch (Exception ex){
//            ExUtils.error( ex, LocaleKey.USER_WITHDRAW_FAILED);
//        }
//        return data;
//    }
    
    
    
}
